Dotaz na hodnotu generaotru

Otázka od: Petr Fejfar

17. 9. 2002 15:30

From: "Ondrej Kelle" <O.Kelle@digitalpublishing.de>

> select gen_id(mygenerator, 1) from rdb$database


Hi,

nejak nemuzu rozchodit uvedeny select z D6prof proti IB6.01 pripojene pres
TIB componenty.

Kdyz ho zadam rucne v IB Consoli nebo v DB Exploreru, tak mi vrati spravnou
hodnotu, ale jakmile ten samy text prikazu spustim v TIBQuery.ExecSQL, tak
dostanu chybu:

Invalid request BLR at offset 75,
generator XXXXXXX is not defined.


Muze mi pls nekdo poradit, co s tim mam udelat,
aby to fungovalo popr. jiny zpusob,
jak dostat hodnotu primarniho klice generovaneho
napr. generatorem+triggerem do klientske aplikace
- neco jako LastInsertRowID?


Thx, pf


Odpovedá: Ondrej Kelle

17. 9. 2002 15:07

>> select gen_id(mygenerator, 1) from rdb$database
>>
> nejak nemuzu rozchodit uvedeny select z D6prof proti IB6.01
> pripojene pres TIB componenty.
>
> Kdyz ho zadam rucne v IB Consoli nebo v DB Exploreru, tak mi
> vrati spravnou hodnotu, ale jakmile ten samy text prikazu
> spustim v TIBQuery.ExecSQL, tak dostanu chybu:
>
> Invalid request BLR at offset 75,
> generator XXXXXXX is not defined.

Myslim, ze namiesto ExecSQL potrebujes zavolat Open, pretoze SELECT ...
statement vracia result set (v tomto pripade len jeden riadok).
S IBX som to neskusal, pouzivam IBObjects (TIB_Cursor) a tam to funguje:

function GetNextGenID(IB_Connection: TIB_Connection; const Generator:
string): Integer;
var
  IB_Cursor: TIB_Cursor;
begin
  Result := -1;
  IB_Cursor := TIB_Cursor.Create(nil);
  try
    IB_Cursor.IB_Connection := IB_Connection;
    IB_Cursor.IB_Transaction := IB_Connection.DefaultTransaction;
    IB_Cursor.SQL.Text := Format('SELECT GEN_ID(%s, 1) FROM RDB$DATABASE',
[Generator]);
    IB_Cursor.Open;
    if not IB_Cursor.EOF then
      Result := IB_Cursor.Fields[0].AsInteger;
  finally
    IB_Cursor.Free;
  end;
end;

HTH
TOndrej

Odpovedá: Ben, Martin (CAP, GCF)

17. 9. 2002 16:23

A co misto TIBQuery.ExecSQL zkusit TIBQuery.Open

Martin Ben


> -----Original Message-----
> From: Petr Fejfar [mailto:development@callnet.cz]
>
> From: "Ondrej Kelle" <O.Kelle@digitalpublishing.de>
>
> > select gen_id(mygenerator, 1) from rdb$database
>
>
> Hi,
>
> nejak nemuzu rozchodit uvedeny select z D6prof proti IB6.01
> pripojene pres
> TIB componenty.
>
> Kdyz ho zadam rucne v IB Consoli nebo v DB Exploreru, tak mi
> vrati spravnou
> hodnotu, ale jakmile ten samy text prikazu spustim v
> TIBQuery.ExecSQL, tak
> dostanu chybu:
>
> Invalid request BLR at offset 75,
> generator XXXXXXX is not defined.
>

Odpovedá: Petr Fejfar

17. 9. 2002 14:11

<Martin.Ben@GECAPITAL.com>



> A co misto TIBQuery.ExecSQL zkusit TIBQuery.Open

Sorry, jen jsem se do mailu upsal
- samozrejme ze volam Open().

Bye, pf

Odpovedá: Jan Sebelík

18. 9. 2002 8:52

> Odesílatel: Petr Fejfar <development@callnet.cz>
> > select gen_id(mygenerator, 1) from rdb$database

Ja bych z Delphi spise zavolal ulozenou proceduru, ktera mi hodnotu generatoru
vrati.

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 0434 692 569 (0776 347735)
=========================================


Odpovedá: Petr Fejfar

18. 9. 2002 19:54

From: "Jan Sebelík" <honza@haes.cz>

> Ja bych z Delphi spise zavolal ulozenou proceduru,
> ktera mi hodnotu generatoru vrati.

Jaky v tom spatrujes prinos?

Me napada jen urcita nezavislost Delphi kodu
na DB stroji, ale tak je specialne u SQL serveru problematicka...


Bye, pf

Odpovedá: Roman

19. 9. 2002 6:32

> From: "Jan Sebelík" <honza@haes.cz>
>
> > Ja bych z Delphi spise zavolal ulozenou proceduru,
> > ktera mi hodnotu generatoru vrati.
>
> Jaky v tom spatrujes prinos?
>
> Me napada jen urcita nezavislost Delphi kodu
> na DB stroji, ale tak je specialne u SQL serveru problematicka...

No neco jako:
procedure VlozZaznam
( pole1...,pole2...,pole3...)
returns
(id...)
as
begin
  id=gen_id(generator,1)
  insert into values (:id,:pole1,...)
end

Spravne ID ziskas hned.
Nejsou nahodou generatory mimo transakcni kontrolu? Co kdyz nez das ten
"select gen_id()" nekdo dalsi provede insert...

Roman
==============================
http://kouzelne.misto.cz

Odpovedá: Petr Fejfar

19. 9. 2002 15:47

From: "Roman" <sw.maurice@seznam.cz>

> Nejsou nahodou generatory mimo transakcni kontrolu?
> Co kdyz nez das ten
> "select gen_id()" nekdo dalsi provede insert...

No a?

Dulezite je, aby funkce gen_id() byla implementovana jako thread safe tj.
jako neprerusitelna tj. aby inkrement hodnoty byl v kriticke sekci a to
doufam je, i kdyz u tech databazistu jeden nikdy nevi  

Pak zadne dva procesy nemohou ziskat stejnou hodnotu (samozrejme neuvazu
pripad gen_id(xxxx,0))


Bye, pf

Odpovedá: Jan Sebelík

19. 9. 2002 9:52

> Odesílatel: Roman <sw.maurice@seznam.cz>
> > Ja bych z Delphi spise zavolal ulozenou proceduru,
> > ktera mi hodnotu generatoru vrati.
> Jaky v tom spatrujes prinos?

Nepotrebuju vedet, co to je rdb$database (nebo co).

Nejsou nahodou generatory mimo transakcni kontrolu? Co kdyz nez das ten
"select gen_id()" nekdo dalsi provede insert...

Generatory jsou mimo transakcni kontrolu.
Jinymi slovy, rollback nevrati hodnotu generatoru zpet.
Jakkoli jsem vyse psal, ze bych preferoval ulozenou proceduru, domnivam se, ze
i "soucasne" zavolany select gen_id(...) vrati ruzne hodnoty ID.

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 0434 692 569 (0776 347735)
=========================================

Odpovedá: Petr Fejfar

19. 9. 2002 10:59

From: "Jan Sebelík" <honza@haes.cz>


> Nepotrebuju vedet, co to je rdb$database (nebo co).

Je pravda, ze aby to vygenerovalo jedinou hodnotu,
tak se u toho selectu musi zajistit, aby tabulka obsahovala prave jeden
zaznam. A u IB je takovou tabulkou RDB$DATABASE - teda pokud do ni nekdo
nevlozi neco dalsiho  

***

Me se to taky moc nelibi, ale IMHO se to v bordelu,
ktery ve svete SQL serveru panuje, docela ztrati  


pf


Odpovedá: Roland Turcan

19. 9. 2002 13:13

<<< 19. 9. 2002 10:01 - "Jan Sebelík" "honza@haes.cz" >>>
>> Odesílatel: Petr Fejfar <development@callnet.cz>
>> > select gen_id(mygenerator, 1) from rdb$database

JS> Ja bych z Delphi spise zavolal ulozenou proceduru, ktera mi hodnotu
generatoru vrati.

Ale aby som si na kazdy generator vytvaral SP to predsa nie je to
prave orechove. Ale som nepochopil co tym myslis.
--
Best regards, TRoland
http://www.rotursoft.sk